/// 原生平台交互服务
/// 
/// 封装Flutter与Android/iOS原生平台的通信
/// 使用Platform Channels实现双向通信
/// 
/// 作者: Fluttert Team
/// 日期: 2024

import 'package:flutter/services.dart';
import '../utils/logger_util.dart';

/// 原生平台服务类
/// 
/// 提供与Android/iOS原生代码交互的方法
class NativeService {
  /// 平台通道名称
  static const String _channelName = 'com.fluttert/native';
  
  /// 方法通道实例
  static const MethodChannel _channel = MethodChannel(_channelName);

  /// 获取设备信息
  /// 
  /// 返回包含设备信息的Map
  /// - platform: 平台名称（Android/iOS）
  /// - version: 系统版本
  /// - model: 设备型号
  static Future<Map<String, dynamic>?> getDeviceInfo() async {
    try {
      final result = await _channel.invokeMethod('getDeviceInfo');
      LoggerUtil.d('获取设备信息成功: $result');
      return Map<String, dynamic>.from(result as Map);
    } on PlatformException catch (e) {
      LoggerUtil.e('获取设备信息失败: ${e.message}', e);
      return null;
    }
  }

  /// 显示原生Toast消息
  /// 
  /// [message] 要显示的消息
  /// [duration] 显示时长（0=短时间，1=长时间）
  static Future<bool> showToast(String message, {int duration = 0}) async {
    try {
      await _channel.invokeMethod('showToast', {
        'message': message,
        'duration': duration,
      });
      LoggerUtil.d('Toast显示成功: $message');
      return true;
    } on PlatformException catch (e) {
      LoggerUtil.e('Toast显示失败: ${e.message}', e);
      return false;
    }
  }

  /// 获取设备电池信息
  /// 
  /// 返回电池电量百分比（0-100）
  static Future<int?> getBatteryLevel() async {
    try {
      final result = await _channel.invokeMethod('getBatteryLevel');
      LoggerUtil.d('获取电池电量成功: $result');
      return result as int?;
    } on PlatformException catch (e) {
      LoggerUtil.e('获取电池电量失败: ${e.message}', e);
      return null;
    }
  }

  /// 打开原生设置页面
  /// 
  /// 返回操作是否成功
  static Future<bool> openSettings() async {
    try {
      await _channel.invokeMethod('openSettings');
      LoggerUtil.d('打开设置页面成功');
      return true;
    } on PlatformException catch (e) {
      LoggerUtil.e('打开设置页面失败: ${e.message}', e);
      return false;
    }
  }

  /// 震动设备
  /// 
  /// [duration] 震动时长（毫秒）
  static Future<bool> vibrate({int duration = 100}) async {
    try {
      await _channel.invokeMethod('vibrate', {'duration': duration});
      LoggerUtil.d('震动成功');
      return true;
    } on PlatformException catch (e) {
      LoggerUtil.e('震动失败: ${e.message}', e);
      return false;
    }
  }

  /// 获取应用版本信息
  /// 
  /// 返回包含版本信息的Map
  /// - versionName: 版本名称
  /// - versionCode: 版本号
  static Future<Map<String, dynamic>?> getAppVersion() async {
    try {
      final result = await _channel.invokeMethod('getAppVersion');
      LoggerUtil.d('获取应用版本成功: $result');
      return Map<String, dynamic>.from(result as Map);
    } on PlatformException catch (e) {
      LoggerUtil.e('获取应用版本失败: ${e.message}', e);
      return null;
    }
  }

  /// 调用原生方法（通用方法）
  /// 
  /// [method] 方法名称
  /// [arguments] 方法参数
  /// 返回方法执行结果
  static Future<dynamic> invokeMethod(
    String method, {
    Map<String, dynamic>? arguments,
  }) async {
    try {
      final result = await _channel.invokeMethod(method, arguments);
      LoggerUtil.d('调用原生方法成功: $method');
      return result;
    } on PlatformException catch (e) {
      LoggerUtil.e('调用原生方法失败: $method, ${e.message}', e);
      rethrow;
    }
  }
}

